package main

import "fmt"

// 结构体模拟实现其他语言中的继承

type Animal struct {
	name string //将一些公共的变量放在一起
}

func NewAnimal(name string) *Animal {
	return &Animal{
		name: name,
	}
}

//给animal实现一个移动的方法
//所有动物都会继承移动这个方法
func (a *Animal) move() {
	fmt.Printf("%s会动", a.name)
}

//定义一个狗类
type dog struct {
	feet    uint8
	*Animal //嵌套匿名字段结构体  animal拥有的方法，dog也有了
}

func NewDog(feet uint8, Animal Animal) *dog {
	return &dog{
		feet:   feet,
		Animal: &Animal,
	}
}

//给狗实现一个汪汪的方法
func (d *dog) wang() {
	fmt.Printf("%s汪汪汪", d.Animal.name) //d.name为提升字段,即animal结构体中的字段对dog结构体来说就是提升字段,dog对象可直接访问animal中的字段
}

func main() {
	//p1 := dog{
	//	animal: animal{
	//		name: "金毛",
	//	},
	//	feet: 4,
	//}
	//fmt.Println(p1)
	//p1.wang()
	//p1.move()
	p1 := NewDog(4, *NewAnimal("旺财")) //*NewAnimal实现了继承，实例化一个对象
	p1.move()
	p1.wang()
}
